package cn.tedu.charging.order.rabbitmq;

import cn.tedu.charging.order.config.RabbitConfiguration;
import cn.tedu.charging.order.pojo.po.OrderMQPO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class RabbitMQProducer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 发送消息
     * @param msg
     */
    public void send(OrderMQPO msg){

        //设置RabbitMQ确认的回调类，判断ack的结果，如果true表示RabbitMQ收到生产者发送的消息
        rabbitTemplate.setConfirmCallback((correlationData, ack, cause)->{
            //correlationData 用来唯一的标识用来区分消息
            //cause 失败原因
            if (ack) {
                log.debug("消息发送成功,RabbitMQ成功收到消息,消息ID:{}",correlationData);
            }else{
                log.debug("消息发送失败,RabbitMQ没有收到消息,消息ID:{}",correlationData);
                log.debug("如果失败，应该进行重试，打日志，如果重试不成功，需要告警,监控");
                log.debug("重试，重复发送，可能会导致消息重复");
            }
        });


        rabbitTemplate.convertAndSend(RabbitConfiguration.EXCHANGE_NAME,
                RabbitConfiguration.ROUTING_KEY, msg);
    }
}
